package pe.cromosoma;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;


public class ListaAlumnos {
	private ArrayList<Alumno> lista;
	private int num_alumnos;
	private int num_restricciones;
	private int num_al_grupo;
	
	public ListaAlumnos(int num_al_grupo){
		this.num_al_grupo=num_al_grupo;
		lista = new ArrayList<Alumno>();
	}
	
	public ListaAlumnos(ListaAlumnos copia){
		this.num_al_grupo= copia.num_al_grupo;
		this.num_restricciones = copia.num_restricciones;
		this.num_alumnos = copia.num_alumnos;
		this.lista = copia.lista; //no es por copia
	}
	
	
	public void cargaDatos(File ruta){
		File f = ruta;
		try {
			BufferedReader br = new BufferedReader(new FileReader(f));
			String linea;
			String[] partes = new String[2];
			linea = br.readLine(); partes = linea.split(" ");
			num_alumnos = Integer.valueOf(partes[0]);
			num_restricciones = Integer.valueOf(partes[1]);

			
			
			for (int i=0; i < num_alumnos; i++){
				linea = br.readLine();
				partes = linea.split(" ");
				int id =Integer.valueOf(partes[0]);
				float nota =Float.valueOf(partes[1]);
				lista.add(new Alumno(id,nota));
			}
			
			for (int i=0; i < num_restricciones; i++){
				linea = br.readLine();
				partes = linea.split(" ");
				Alumno aux = dameAlumnoId(Integer.valueOf(partes[0]));
				aux.addRestriccion(Integer.valueOf(partes[1]));
			}
			//Insertamos alumnos inexistentes para cuadrar los grupos.
			int al_anyadir = num_al_grupo-(num_alumnos % num_al_grupo); 
			for (int i=0; i<al_anyadir;i++){
				lista.add(new Alumno(-1-i,0));
				num_alumnos++;
			}
		} catch (Exception e) {
		}
		
	}
		private Alumno dameAlumnoId(int id){
			Alumno al;
			Iterator<Alumno> iterator = lista.listIterator();
			while( iterator.hasNext()) {
				al = iterator.next();
				if(al.getIdentificador() == id) return al;
			}
			return null;
		}
		
		
		public int[] numRestriccionesVioladas(Cromosoma cromo){
			int[] respuesta = new int[num_alumnos/num_al_grupo];
			for(int i=0; i<num_alumnos/num_al_grupo;i++){
				int rest = 0;
				for (int j = 0;j<num_al_grupo;j++){
					Alumno al = this.lista.get(cromo.indices[j+(i*num_al_grupo)]);
					for (int k = 0;k<num_al_grupo;k++){
						int en = this.lista.get(cromo.indices[k+(i*num_al_grupo)]).getIdentificador();
						if(al.contieneEnemigo(en))
							rest++;
					}
				}
				respuesta[i]=rest;
			}
			return respuesta;
		}
		
		
		/**
		 * 
		 * GETTERS Y SETTERS
		 */
		public ArrayList<Alumno> getLista() {
			return lista;
		}

		public void setLista(ArrayList<Alumno> lista) {
			this.lista = lista;
		}

		public int getNum_alumnos() {
			return num_alumnos;
		}

		public void setNum_alumnos(int num_alumnos) {
			this.num_alumnos = num_alumnos;
		}

		public int getNum_restricciones() {
			return num_restricciones;
		}

		public void setNum_restricciones(int num_restricciones) {
			this.num_restricciones = num_restricciones;
		}
		
		
}
